﻿using System;
using System.Collections.Generic;
using Com.Alipay;

using PuSuoPai;

/// <summary>
/// 功能：服务器异步通知页面
/// 版本：3.3
/// 日期：2012-07-10
/// 说明：
/// 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
/// 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。
/// 
/// ///////////////////页面功能说明///////////////////
/// 创建该页面文件时，请留心该页面文件中无任何HTML代码及空格。
/// 该页面不能在本机电脑测试，请到服务器上做测试。请确保外部可以访问该页面。
/// 该页面调试工具请使用写文本函数logResult。
/// 如果没有收到该页面返回的 success 信息，支付宝会在24小时内按一定的时间策略重发通知
/// </summary>
public class AlipayPlugin
{
	static public string CheckPay(AlipayRqt request)
	{
		if (request == null)
			return "无通知参数";

		SortedDictionary<string, string> sPara = GetRequestPost(request);

		if (sPara.Count > 0)//判断是否有带返回参数
		{
			Notify aliNotify = new Notify();
			bool verifyResult = aliNotify.Verify(sPara, request.notify_id, request.sign);

			if (verifyResult)//验证成功
			{
				/////////////////////////////////////////////////////////////////////////////////////////////////////////////
				//请在这里加上商户的业务逻辑程序代码


				//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
				//获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表

				//商户订单号
				string out_trade_no = request.out_trade_no;

				//支付宝交易号
				string trade_no = request.trade_no;

				//交易状态
				string trade_status = request.trade_status;


				if (trade_status== "TRADE_FINISHED")
				{
					//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//如果有做过处理，不执行商户的业务程序

					//注意：
					//该种交易状态只在两种情况下出现
					//1、开通了普通即时到账，买家付款成功后。
					//2、开通了高级即时到账，从该笔交易成功时间算起，过了签约时的可退款时限（如：三个月以内可退款、一年以内可退款等）后。
				}
				else if(trade_status== "TRADE_SUCCESS")
				{
					//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//如果有做过处理，不执行商户的业务程序

					//注意：
					//该种交易状态只在一种情况下出现——开通了高级即时到账，买家付款成功后。
				}
				else
				{
				}

				//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

				return "success";  //请不要修改或删除

				/////////////////////////////////////////////////////////////////////////////////////////////////////////////
			}
			else//验证失败
			{
				return "fail";
			}
		}
		else
		{
			return "无通知参数";
		}
	}

	/// <summary>
	/// 获取支付宝POST过来通知消息，并以“参数名=参数值”的形式组成数组
	/// </summary>
	/// <returns>request回来的信息组成的数组</returns>
	static public SortedDictionary<string, string> GetRequestPost(AlipayRqt request)
	{
		SortedDictionary<string, string> sArray = new SortedDictionary<string, string>();

		sArray.Add("notify_time", request.notify_time);
		sArray.Add("notify_type", request.notify_type);
		sArray.Add("notify_id", request.notify_id);
		sArray.Add("sign_type", request.sign_type);	
		sArray.Add("sign", request.sign);

		sArray.Add("out_trade_no", request.out_trade_no);
		sArray.Add("subject", request.subject);
		sArray.Add("payment_type", request.payment_type);
		sArray.Add("trade_no", request.trade_no);
		sArray.Add("trade_status", request.trade_status);
		sArray.Add("seller_id", request.seller_id);
		sArray.Add("seller_email", request.seller_email);
		sArray.Add("buyer_id", request.buyer_id);
		sArray.Add("buyer_email", request.buyer_email);
		sArray.Add("total_fee", request.total_fee);
		sArray.Add("quantity", request.quantity);
		sArray.Add("price", request.Price);
		sArray.Add("body", request.body);
		sArray.Add("gmt_create", request.gmt_create);
		sArray.Add("gmt_payment", request.gmt_payment);
		sArray.Add("is_total_fee_adjust", request.is_total_fee_adjust);
		sArray.Add("use_coupon", request.use_coupon);
		sArray.Add("discount", request.discount);
		sArray.Add("refund_status", request.refund_status);
		sArray.Add("gmt_refund", request.gmt_refund);

		return sArray;
	}
}

